// 从 NestJS 公共模块导入 Injectable 装饰器，用于标记可注入的服务类
import { Injectable } from '@nestjs/common';
// 从 NestJS TypeORM 模块导入 InjectRepository 装饰器，用于注入仓库
import { InjectRepository } from '@nestjs/typeorm';
// 从 TypeORM 库导入 Repository 类型，用于定义仓库
import { Repository } from 'typeorm';
// 导入帖子实体类
import { Post } from './entities/post.entity';
// 导入创建帖子数据传输对象
import { CreatePostDto } from './dto/create-post.dto';

/**
 * 帖子服务类，提供与帖子相关的业务逻辑
 */
@Injectable()
export class PostsService {
  /**
   * 构造函数，注入帖子仓库
   * @param postsRepository - 帖子实体的仓库实例
   */
  constructor(
    // 注入 Post 实体的仓库
    @InjectRepository(Post)
    private postsRepository: Repository<Post>,
  ) {}

  /**
   * 查询所有帖子
   * @returns 返回所有帖子的数组
   */
  findAll() {
    // 调用仓库的 find 方法查询所有帖子
    return this.postsRepository.find();
  }

  /**
   * 根据 ID 查询单个帖子
   * @param id - 帖子的 ID
   * @returns 返回查询到的帖子
   * @throws {Error} 当帖子不存在时抛出异常
   */
  async findOne(id: number) {
    // 根据 ID 查询帖子
    const post = await this.postsRepository.findOne({ where: { id } });
    // 如果帖子不存在，抛出异常
    if (!post) {
      throw new Error(`Post with ID ${id} not found`);
    }
    return post;
  }

  /**
   * 创建新帖子
   * @param createPostDto - 创建帖子的数据传输对象
   * @returns 返回创建成功的帖子
   */
  create(createPostDto: CreatePostDto) {
    // 根据 DTO 创建帖子实体实例
    const post = this.postsRepository.create(createPostDto);
    // 保存帖子实体到数据库
    return this.postsRepository.save(post);
  }
}